JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒãyieldæãããã¯ãã¬ãã·ã£ãŒæè¡ã解説ãå¹ççãªéåæã¹ããªãŒã åŠçãšãå ç¢ã§ã¹ã±ãŒã©ãã«ãªããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯æ¹æ³ãåŠã³ãŸãã
JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒãšYieldïŒã¹ããªãŒã å¶åŸ¡ãšããã¯ãã¬ãã·ã£ãŒããã¹ã¿ãŒãã
éåæããã°ã©ãã³ã°ã¯ãç¹ã«I/Oæäœããããã¯ãŒã¯ãªã¯ãšã¹ããå€§èŠæš¡ãªããŒã¿ã»ãããæ±ãçŸä»£ã®JavaScriptéçºã®åºç€ã§ããéåæãžã§ãã¬ãŒã¿ãŒã¯ãyieldããŒã¯ãŒããšçµã¿åãããããšã§ãéåæã€ãã¬ãŒã¿ãŒãäœæããããã®åŒ·åãªã¡ã«ããºã ãæäŸããå¹ççãªã¹ããªãŒã å¶åŸ¡ãšããã¯ãã¬ãã·ã£ãŒã®å®è£
ãå¯èœã«ããŸãããã®èšäºã§ã¯ãéåæãžã§ãã¬ãŒã¿ãŒã®è€éãªä»çµã¿ãšãã®å¿çšã«ã€ããŠãå®è·µçãªäŸãšå®çšçãªæŽå¯ã亀ããŠè©³ãã解説ããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®çè§£
éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåžžã®ãžã§ãã¬ãŒã¿ãŒãšåæ§ã«å®è¡ãäžæåæ¢ããåŸã§åéã§ãã颿°ã§ãããéåæã®å€ãæ±ãããšããè¿œå æ©èœããããŸããäž»ãªéãã¯ãfunctionããŒã¯ãŒãã®åã«asyncããŒã¯ãŒãã䜿çšããyieldããŒã¯ãŒãã䜿ã£ãŠéåæã«å€ãçæããç¹ã§ããããã«ããããžã§ãã¬ãŒã¿ãŒã¯ã¡ã€ã³ã¹ã¬ããããããã¯ããããšãªããæéçµéãšãšãã«äžé£ã®å€ãçæã§ããŸãã
æ§æ:
async function* asyncGeneratorFunction() {
// Asynchronous operations and yield statements
yield await someAsyncOperation();
}
æ§æãåè§£ããŠã¿ãŸããã:
async function*: éåæãžã§ãã¬ãŒã¿ãŒé¢æ°ã宣èšããŸããã¢ã¹ã¿ãªã¹ã¯ïŒ*ïŒã¯ãããããžã§ãã¬ãŒã¿ãŒã§ããããšã瀺ããŸããyield: ãžã§ãã¬ãŒã¿ãŒã®å®è¡ãäžæåæ¢ããåŒã³åºãå ã«å€ãè¿ããŸããawaitãšçµã¿åãããŠäœ¿çšããïŒyield awaitïŒãšãéåææäœãå®äºããã®ãåŸ ã£ãŠããçµæãçæããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®äœæ
éåæã§äžé£ã®æ°å€ãçæããéåæãžã§ãã¬ãŒã¿ãŒã®ç°¡åãªäŸã以äžã«ç€ºããŸã:
async function* numberGenerator(limit) {
for (let i = 0; i < limit; i++) {
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate an asynchronous delay
yield i;
}
}
ãã®äŸã§ã¯ãnumberGenerator颿°ã¯500ããªç§ããšã«æ°å€ãçæããŸããawaitããŒã¯ãŒãã«ããããžã§ãã¬ãŒã¿ãŒã¯ã¿ã€ã ã¢ãŠããå®äºãããŸã§äžæåæ¢ããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã®å©çš
éåæãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠçæãããå€ãå©çšããã«ã¯ãfor await...ofã«ãŒãã䜿çšã§ããŸã:
async function consumeGenerator() {
for await (const number of numberGenerator(5)) {
console.log(number); // Output: 0, 1, 2, 3, 4 (with 500ms delay between each)
}
console.log('Done!');
}
consumeGenerator();
for await...ofã«ãŒãã¯ãéåæãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠçæãããå€ãå埩åŠçããŸããawaitããŒã¯ãŒãã«ãããã«ãŒãã¯æ¬¡ã®ã€ãã¬ãŒã·ã§ã³ã«é²ãåã«åå€ã解決ãããã®ãåŸ
ã¡ãŸãã
éåæãžã§ãã¬ãŒã¿ãŒã«ããã¹ããªãŒã å¶åŸ¡
éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåæããŒã¿ã¹ããªãŒã ã«å¯Ÿãããã现ãããªå¶åŸ¡ãæäŸããŸããããã«ãããç¹å®ã®æ¡ä»¶ã«åºã¥ããŠã¹ããªãŒã ãäžæåæ¢ãåéãããã«ã¯çµäºãããããšãã§ããŸããããã¯ãå€§èŠæš¡ãªããŒã¿ã»ããããªã¢ã«ã¿ã€ã ã®ããŒã¿ãœãŒã¹ãæ±ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
ã¹ããªãŒã ã®äžæåæ¢ãšåé
yieldããŒã¯ãŒãã¯æ¬è³ªçã«ã¹ããªãŒã ãäžæåæ¢ããŸããæ¡ä»¶ä»ãããžãã¯ãå°å
¥ããŠãã¹ããªãŒã ããã€ãã©ã®ããã«åéãããããå¶åŸ¡ã§ããŸãã
äŸ: ã¬ãŒãå¶éãããããŒã¿ã¹ããªãŒã
async function* rateLimitedStream(data, rateLimit) {
for (const item of data) {
await new Promise(resolve => setTimeout(resolve, rateLimit));
yield item;
}
}
async function consumeRateLimitedStream(data, rateLimit) {
for await (const item of rateLimitedStream(data, rateLimit)) {
console.log('Processing:', item);
}
}
const data = [1, 2, 3, 4, 5];
const rateLimit = 1000; // 1 second
consumeRateLimitedStream(data, rateLimit);
ãã®äŸã§ã¯ãrateLimitedStreamãžã§ãã¬ãŒã¿ãŒã¯åã¢ã€ãã ãçæããåã«æå®ãããæéïŒrateLimitïŒã ãäžæåæ¢ããããŒã¿ãåŠçãããã¬ãŒãã广çã«å¶åŸ¡ããŸããããã¯ãäžæµã®ã³ã³ã·ã¥ãŒããŒãå§åããã®ãé¿ããããAPIã®ã¬ãŒãå¶éãéµå®ãããããã®ã«åœ¹ç«ã¡ãŸãã
ã¹ããªãŒã ã®çµäº
éåæãžã§ãã¬ãŒã¿ãŒã¯ã颿°ããåçŽã«ãªã¿ãŒã³ãããããšã©ãŒãã¹ããŒããããšã§çµäºã§ããŸããã€ãã¬ãŒã¿ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®return()ã¡ãœãããšthrow()ã¡ãœããã¯ããžã§ãã¬ãŒã¿ãŒã®çµäºãããæç€ºçã«éç¥ããæ¹æ³ãæäŸããŸãã
äŸ: æ¡ä»¶ã«åºã¥ãã¹ããªãŒã ã®çµäº
async function* conditionalStream(data, condition) {
for (const item of data) {
if (condition(item)) {
console.log('Terminating stream...');
return;
}
yield item;
}
}
async function consumeConditionalStream(data, condition) {
for await (const item of conditionalStream(data, condition)) {
console.log('Processing:', item);
}
console.log('Stream completed.');
}
const data = [1, 2, 3, 4, 5];
const condition = (item) => item > 3;
consumeConditionalStream(data, condition);
ãã®äŸã§ã¯ãconditionalStreamãžã§ãã¬ãŒã¿ãŒã¯ãããŒã¿å
ã®ã¢ã€ãã ã«å¯ŸããŠcondition颿°ãtrueãè¿ãããšãã«çµäºããŸããããã«ãããåçãªåºæºã«åºã¥ããŠã¹ããªãŒã ã®åŠçã忢ã§ããŸãã
éåæãžã§ãã¬ãŒã¿ãŒã«ããããã¯ãã¬ãã·ã£ãŒ
ããã¯ãã¬ãã·ã£ãŒã¯ããããã¥ãŒãµãŒãã³ã³ã·ã¥ãŒããŒã®åŠçé床ãããéãããŒã¿ãçæããéåæããŒã¿ã¹ããªãŒã ãæ±ãããã®éèŠãªã¡ã«ããºã ã§ããããã¯ãã¬ãã·ã£ãŒããªããšãã³ã³ã·ã¥ãŒããŒãå§åãããããã©ãŒãã³ã¹ã®äœäžãé害ã«ã€ãªããå¯èœæ§ããããŸããéåæãžã§ãã¬ãŒã¿ãŒã¯ãé©åãªã·ã°ããªã³ã°ã¡ã«ããºã ãšçµã¿åãããããšã§ãããã¯ãã¬ãã·ã£ãŒã广çã«å®è£ ã§ããŸãã
ããã¯ãã¬ãã·ã£ãŒã®çè§£
ããã¯ãã¬ãã·ã£ãŒãšã¯ãã³ã³ã·ã¥ãŒããŒããããã¥ãŒãµãŒã«å¯ŸããŠãããå€ãã®ããŒã¿ãåŠçã§ããæºåãæŽããŸã§ããŒã¿ã¹ããªãŒã ãé ããããäžæåæ¢ããããã«åå³ãéãããšã§ããããã«ãããã³ã³ã·ã¥ãŒããŒãéè² è·ã«ãªãã®ãé²ããå¹ççãªãªãœãŒã¹å©çšãä¿èšŒãããŸãã
äžè¬çãªããã¯ãã¬ãã·ã£ãŒæŠç¥:
- ãããã¡ãªã³ã°: ã³ã³ã·ã¥ãŒããŒã¯åŠçã§ãããŸã§åä¿¡ããŒã¿ããããã¡ãªã³ã°ããŸãããã ãããããã¡ã倧ãããªãããããšã¡ã¢ãªã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
- ç Žæ£: ã³ã³ã·ã¥ãŒããŒã¯ãããã«åŠçã§ããªãå Žåã«åä¿¡ããŒã¿ãç Žæ£ããŸããããã¯ãããŒã¿æå€±ã蚱容ãããã·ããªãªã«é©ããŠããŸãã
- ã·ã°ããªã³ã°: ã³ã³ã·ã¥ãŒããŒã¯ãããã¥ãŒãµãŒã«æç€ºçã«ããŒã¿ã¹ããªãŒã ãé ããããäžæåæ¢ããããã«åå³ãéããŸããããã«ãããæå€§éã®å¶åŸ¡ãå¯èœãšãªããããŒã¿æå€±ãåé¿ã§ããŸããããããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒéã®é£æºãå¿ èŠã§ãã
éåæãžã§ãã¬ãŒã¿ãŒã«ããããã¯ãã¬ãã·ã£ãŒã®å®è£
éåæãžã§ãã¬ãŒã¿ãŒã¯ãã³ã³ã·ã¥ãŒããŒãnext()ã¡ãœãããéããŠãžã§ãã¬ãŒã¿ãŒã«ã·ã°ãã«ãè¿éã§ããããã«ããããšã§ãããã¯ãã¬ãã·ã£ãŒã®å®è£
ã容æã«ããŸãããžã§ãã¬ãŒã¿ãŒã¯ãããã®ã·ã°ãã«ã䜿çšããŠãããŒã¿çæã¬ãŒãã調æŽã§ããŸãã
äŸ: ã³ã³ã·ã¥ãŒããŒäž»å°ã®ããã¯ãã¬ãã·ã£ãŒ
async function* producer(consumer) {
let i = 0;
while (true) {
const shouldContinue = await consumer(i);
if (!shouldContinue) {
console.log('Producer paused.');
return;
}
yield i++;
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate some work
}
}
async function consumer(item) {
return new Promise(resolve => {
setTimeout(() => {
console.log('Consumed:', item);
resolve(item < 10); // Stop after consuming 10 items
}, 500);
});
}
async function main() {
const generator = producer(consumer);
for await (const value of generator) {
// No consumer-side logic needed, it's handled by the consumer function
}
console.log('Stream completed.');
}
main();
ãã®äŸã§ã¯:
producer颿°ã¯ãç¶ç¶çã«æ°å€ãçæããéåæãžã§ãã¬ãŒã¿ãŒã§ããåŒæ°ãšããŠconsumer颿°ãåãåããŸããconsumer颿°ã¯ãããŒã¿ã®éåæåŠçãã·ãã¥ã¬ãŒãããŸãããããã¥ãŒãµãŒãããŒã¿çæãç¶ããã¹ããã©ããã瀺ãããŒã«å€ã§è§£æ±ºãããPromiseãè¿ããŸããproducer颿°ã¯ã次ã®å€ãçæããåã«consumer颿°ã®çµæãåŸ ã¡ãŸããããã«ãããã³ã³ã·ã¥ãŒããŒã¯ãããã¥ãŒãµãŒã«ããã¯ãã¬ãã·ã£ãŒããããããšãã§ããŸãã
ãã®äŸã¯ãããã¯ãã¬ãã·ã£ãŒã®åºæ¬çãªåœ¢åŒã瀺ããŠããŸããããé«åºŠãªå®è£ ã§ã¯ãã³ã³ã·ã¥ãŒããŒåŽã®ãããã¡ãªã³ã°ãåçãªã¬ãŒã調æŽããšã©ãŒãã³ããªã³ã°ãªã©ãå«ãŸããå ŽåããããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
ãšã©ãŒãã³ããªã³ã°
éåæããŒã¿ã¹ããªãŒã ãæ±ãéã«ã¯ããšã©ãŒãã³ããªã³ã°ãéåžžã«éèŠã§ããéåæãžã§ãã¬ãŒã¿ãŒå
ã§try...catchãããã¯ã䜿çšããŠãéåææäœäžã«çºçããå¯èœæ§ã®ãããšã©ãŒããã£ããããŠåŠçã§ããŸãã
äŸ: éåæãžã§ãã¬ãŒã¿ãŒã§ã®ãšã©ãŒãã³ããªã³ã°
async function* errorProneGenerator() {
try {
const result = await someAsyncOperationThatMightFail();
yield result;
} catch (error) {
console.error('Error:', error);
// Decide whether to re-throw, yield a default value, or terminate the stream
yield null; // Yield a default value and continue
//throw error; // Re-throw the error to terminate the stream
//return; // Terminate the stream gracefully
}
}
ãŸããã€ãã¬ãŒã¿ãŒã®throw()ã¡ãœããã䜿çšããŠãå€éšãããžã§ãã¬ãŒã¿ãŒã«ãšã©ãŒã泚å
¥ããããšãã§ããŸãã
ã¹ããªãŒã ã®å€æ
éåæãžã§ãã¬ãŒã¿ãŒã¯ãé£çµããŠããŒã¿åŠçãã€ãã©ã€ã³ãäœæã§ããŸããããéåæãžã§ãã¬ãŒã¿ãŒã®åºåãå¥ã®ãžã§ãã¬ãŒã¿ãŒã®å ¥åã«å€æãã颿°ãäœæã§ããŸãã
äŸ: ã·ã³ãã«ãªå€æãã€ãã©ã€ã³
async function* mapStream(source, transform) {
for await (const item of source) {
yield transform(item);
}
}
async function* filterStream(source, filter) {
for await (const item of source) {
if (filter(item)) {
yield item;
}
}
}
// Example usage:
async function main() {
async function* numberGenerator(limit) {
for (let i = 0; i < limit; i++) {
yield i;
}
}
const source = numberGenerator(10);
const doubled = mapStream(source, (x) => x * 2);
const evenNumbers = filterStream(doubled, (x) => x % 2 === 0);
for await (const number of evenNumbers) {
console.log(number); // Output: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18
}
}
main();
ãã®äŸã§ã¯ãmapStream颿°ãšfilterStream颿°ãããããããŒã¿ã¹ããªãŒã ã倿ããã³ãã£ã«ã¿ãªã³ã°ããŸããããã«ãããè€æ°ã®éåæãžã§ãã¬ãŒã¿ãŒãçµã¿åãããŠè€éãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæã§ããŸãã
ä»ã®ã¹ããªãŒãã³ã°ã¢ãããŒããšã®æ¯èŒ
éåæãžã§ãã¬ãŒã¿ãŒã¯éåæã¹ããªãŒã ãæ±ã匷åãªæ¹æ³ãæäŸããŸãããJavaScript Streams APIïŒReadableStreamãWritableStreamãªã©ïŒãRxJSã®ãããªã©ã€ãã©ãªãªã©ãä»ã®ã¢ãããŒããååšããŸããåã¢ãããŒãã«ã¯ããããã®é·æãšçæããããŸãã
- éåæãžã§ãã¬ãŒã¿ãŒ: éåæã€ãã¬ãŒã¿ãŒãäœæããããã¯ãã¬ãã·ã£ãŒãå®è£ ããããã®æ¯èŒçã«ã·ã³ãã«ã§çŽæçãªæ¹æ³ãæäŸããŸããã¹ããªãŒã ã«å¯Ÿãããã现ãããªå¶åŸ¡ãå¿ èŠã§ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã©ã€ãã©ãªã®å šæ©èœãŸã§ã¯å¿ èŠãšããªãã·ããªãªã«é©ããŠããŸãã
- JavaScript Streams API: ç¹ã«ãã©ãŠã¶ã«ãããŠãã¹ããªãŒã ãæ±ãããã®ããæšæºåãããããã©ãŒãã³ã¹ã®é«ãæ¹æ³ãæäŸããŸããããã¯ãã¬ãã·ã£ãŒãæ§ã ãªã¹ããªãŒã 倿ã®ããã®çµã¿èŸŒã¿ãµããŒããæäŸããŸãã
- RxJS: éåæããŒã¿ã¹ããªãŒã ã倿ããã£ã«ã¿ãªã³ã°ãçµåããããã®è±å¯ãªãªãã¬ãŒã¿ãŒã»ãããæäŸãã匷åãªãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã©ã€ãã©ãªã§ãããªã¢ã«ã¿ã€ã ããŒã¿ãã€ãã³ããã³ããªã³ã°ãå«ãè€éãªã·ããªãªã«é©ããŠããŸãã
ã©ã®ã¢ãããŒããéžæãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«äŸåããŸããåçŽãªã¹ããªãŒã åŠçã¿ã¹ã¯ã«ã¯ãéåæãžã§ãã¬ãŒã¿ãŒã§ååãããããŸãããããè€éãªã·ããªãªã§ã¯ãJavaScript Streams APIãRxJSãããé©åãããããŸããã
å®äžçã§ã®å¿çšäŸ
éåæãžã§ãã¬ãŒã¿ãŒã¯ãæ§ã ãªå®äžçã®ã·ããªãªã§äŸ¡å€ãçºæ®ããŸã:
- å€§èŠæš¡ãã¡ã€ã«ã®èªã¿èŸŒã¿: ãã¡ã€ã«å šäœãã¡ã¢ãªã«èªã¿èŸŒãããšãªããå€§èŠæš¡ãªãã¡ã€ã«ããã£ã³ã¯ããšã«èªã¿èŸŒã¿ãŸããããã¯ãå©çšå¯èœãªRAMããã倧ããªãã¡ã€ã«ãåŠçããããã«äžå¯æ¬ ã§ãããã°ãã¡ã€ã«åæïŒäŸïŒå°ççã«åæ£ãããµãŒããŒéã®WebãµãŒããŒãã°ãåæããŠã»ãã¥ãªãã£è åšãæ€åºããïŒããå€§èŠæš¡ãªç§åŠããŒã¿ã»ããã®åŠçïŒäŸïŒè€æ°ã®å Žæã«ä¿åããããã¿ãã€ãèŠæš¡ã®ã²ãã ããŒã¿åæïŒãªã©ã®ã·ããªãªãèããããŸãã
- APIããã®ããŒã¿ååŸ: å€§èŠæš¡ãªããŒã¿ã»ãããè¿ãAPIããããŒã¿ãååŸããéã«ããŒãžããŒã·ã§ã³ãå®è£ ããŸããããŒã¿ããããã§ååŸããå©çšå¯èœã«ãªã£ãåããããçæããããšã§ãAPIãµãŒããŒãžã®éè² è·ãé¿ããŸããeã³ããŒã¹ãã©ãããã©ãŒã ãæ°çŸäžã®ååãååŸãããããœãŒã·ã£ã«ã¡ãã£ã¢ãµã€ãããŠãŒã¶ãŒã®æçš¿å±¥æŽå šäœãã¹ããªãŒãã³ã°ããããããããªã·ããªãªãèããããŸãã
- ãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã : WebSocketsããµãŒããŒéä¿¡ã€ãã³ããªã©ã®ãœãŒã¹ããã®ãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã ãåŠçããŸããããã¯ãã¬ãã·ã£ãŒãå®è£ ããŠãã³ã³ã·ã¥ãŒããŒãããŒã¿ã¹ããªãŒã ã«è¿œãã€ããããã«ããŸããéèåžå Žãè€æ°ã®ã°ããŒãã«ååŒæããæ ªäŸ¡ããŒã¿ãåä¿¡ããããIoTã»ã³ãµãŒãç¶ç¶çã«ç°å¢ããŒã¿ãéä¿¡ããããããããªã·ããªãªãèããããŸãã
- ããŒã¿ããŒã¹ãšã®ããåã: ããŒã¿ããŒã¹ããã®ã¯ãšãªçµæãã¹ããªãŒãã³ã°ããçµæã»ããå šäœãã¡ã¢ãªã«èªã¿èŸŒã代ããã«ãããŒã¿ãäžè¡ãã€åŠçããŸããããã¯ç¹ã«å€§èŠæš¡ãªããŒã¿ããŒã¹ããŒãã«ã§åœ¹ç«ã¡ãŸããåœéçãªéè¡ãæ°çŸäžã®å£åº§ããã®ååŒãåŠçããããã°ããŒãã«ãªç©æµäŒç€Ÿã倧éžéã®é éã«ãŒããåæããããããããªã·ããªãªãèããããŸãã
- ç»åããã³åç»åŠç: ç»åãåç»ããŒã¿ããã£ã³ã¯ã§åŠçããå¿ èŠã«å¿ããŠå€æããã£ã«ã¿ãé©çšããŸããããã«ãããã¡ã¢ãªã®å¶éã«ã¶ã€ããããšãªãã倧ããªã¡ãã£ã¢ãã¡ã€ã«ãæ±ãããšãã§ããŸããç°å¢ã¢ãã¿ãªã³ã°ã®ããã®è¡æç»ååæïŒäŸïŒæ£®æç Žå£ã®è¿œè·¡ïŒããè€æ°ã®ã»ãã¥ãªãã£ã«ã¡ã©ããã®ç£èŠæ åã®åŠçãªã©ãèããããŸãã
çµè«
JavaScriptã®éåæãžã§ãã¬ãŒã¿ãŒã¯ãéåæããŒã¿ã¹ããªãŒã ãæ±ãããã®åŒ·åã§æè»ãªã¡ã«ããºã ãæäŸããŸããéåæãžã§ãã¬ãŒã¿ãŒãšyieldããŒã¯ãŒããçµã¿åãããããšã§ãå¹ççãªã€ãã¬ãŒã¿ãŒãäœæããã¹ããªãŒã å¶åŸ¡ãå®è£
ããããã¯ãã¬ãã·ã£ãŒã广çã«ç®¡çã§ããŸãããããã®æŠå¿µãçè§£ããããšã¯ãå€§èŠæš¡ãªããŒã¿ã»ããããªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã ãæ±ãããšãã§ããå
ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®èšäºã§èª¬æãããã¯ããã¯ã掻çšããããšã§ãéåæã³ãŒããæé©åãããŠãŒã¶ãŒã®å°ççãªå Žæãç¹å®ã®ããŒãºã«é¢ä¿ãªããããå¿çæ§ãé«ãå¹ççãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã